題目描述為: 用一個二維陣列來表示一張地圖,其中陣列內元素值為 1 表示土地,元素值為 0 表示水,那些連在一起的土地形成了一座島嶼,而整張地圖只有一個島嶼,要我們找出島嶼的周長。
我們可以按照定義遍歷所有格子點,檢查與其相鄰的4個邊是否碰到邊界或者碰到水域,若有則周長+1,每個格子點周長至多加4。
參考程式碼
func islandPerimeter(grid [][]int) int {
Ans := 0
lx := len(grid)
ly := len(grid[0])
for i := 0; i < lx; i++ {
for j := 0; j < ly; j++ {
// in water region
if grid[i][j] == 0 {
continue
}
//up
if j-1 < 0 || grid[i][j-1] == 0 {
Ans++
}
//down
if j+1 >= ly || grid[i][j+1] == 0 {
Ans++
}
//left
if i-1 < 0 || grid[i-1][j] == 0 {
Ans++
}
//right
if i+1 >= lx || grid[i+1][j] == 0 {
Ans++
}
}
}
return Ans
}
方法 1 遍歷全部格子點,此方法當島嶼數量不為 1 時以及計算島嶼面積時,仍然適用。若要求島嶼數量時,則需增加變數來紀錄各格子點為土地時,所在的島嶼編號。
我將解法加上簡單的測試,上傳程式碼到此。
數學上對於研究周長問題的過程中也發展了許多重要的思想與方法,我舉其中幾例: